﻿//#define _DEBUG
//定义不是2L的程序
//#define _N2L
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FVXCOMDIDOLib;
using System.Configuration;

namespace Common
{

    public class FIO01 : IDisposable
    {
        #region IO卡操作
        private IOState DI_PORT;
        System.Timers.Timer tmr;
        public Action b0EdgeEvent;
        private FVXCOMDIDOLib.FvxDido m_DIDO = null;
        public IOState CurrentDO
        {
            get
            {
                int lout = 0;
#if _DEBUG
#else
                m_DIDO.GetWrite(out lout);
#endif
                return new IOState(lout);
            }
        }
        static int ioAllTestOK = int.Parse(ConfigurationManager.AppSettings["IOAllTestOK"]);//所有测试OK信号IO。
        static int ioRunning = int.Parse(ConfigurationManager.AppSettings["IORunning"]);//所有测试OK信号IO。
        public FIO01()
        {
            try
            {
#if _DEBUG
#else
                m_DIDO = new FVXCOMDIDOLib.FvxDidoClass();
                //   m_DIDO.Write(1); 
#endif
                DI_PORT = new IOState(0);


            }
            catch (Exception)
            {

                throw;
            }
        }

     /*  volatile bool bTemp = true;*/
        private void Tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {

            //   LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType,string.Format( "所有测试完成IO：{0}",iIO));
            //事件
#if _DEBUG
#else

            if ((State[ioAllTestOK] == true)/*&& (CurrentDO[1] == true)&&(bTemp==false)*/)
            {
              //  bTemp = State[ioAllTestOK];
                  tmr.Stop();
               if (b0EdgeEvent != null)
                {  
#if _N2L
                   m_DIDO.Write(1);
#endif
                 //   while (CurrentDO[1]);
                    b0EdgeEvent();
                //    while (!CurrentDO[1]);
                    while (State[ioAllTestOK]);
                }
                tmr.Start();
            }
           // bTemp = State[ioAllTestOK];
#endif
        }

        public IOState State
        {
            get
            {
                ReadIos();
                return DI_PORT;
            }
            set
            {
                WriteIos(value);
            }
        }
        private int? DevID = null;
        private void ReadIos()
        {
            try
            {
#if _DEBUG
                DI_PORT = new IOState(0xD8);

#else
                int lpBitPattern;
                m_DIDO.Read(out lpBitPattern);
                DI_PORT.io0 = (lpBitPattern & 0x01) > 0 ? true : false;
                DI_PORT.io1 = (lpBitPattern >> 1 & 0x01) > 0 ? true : false;
                DI_PORT.io2 = (lpBitPattern >> 2 & 0x01) > 0 ? true : false;
                DI_PORT.io3 = (lpBitPattern >> 3 & 0x01) > 0 ? true : false;
                DI_PORT.io4 = (lpBitPattern >> 4 & 0x01) > 0 ? true : false;
                DI_PORT.io5 = (lpBitPattern >> 5 & 0x01) > 0 ? true : false;
                DI_PORT.io6 = (lpBitPattern >> 6 & 0x01) > 0 ? true : false;
                DI_PORT.io7 = (lpBitPattern >> 7 & 0x01) > 0 ? true : false;
                DI_PORT.io8 = (lpBitPattern >> 8 & 0x01) > 0 ? true : false;
                DI_PORT.io9 = (lpBitPattern >> 9 & 0x01) > 0 ? true : false;
                DI_PORT.io10 = (lpBitPattern >> 10 & 0x01) > 0 ? true : false;
                DI_PORT.io11 = (lpBitPattern >> 11 & 0x01) > 0 ? true : false;
                DI_PORT.io12 = (lpBitPattern >> 12 & 0x01) > 0 ? true : false;
                DI_PORT.io13 = (lpBitPattern >> 13 & 0x01) > 0 ? true : false;
                DI_PORT.io14 = (lpBitPattern >> 14 & 0x01) > 0 ? true : false;
                DI_PORT.io15 = (lpBitPattern >> 15 & 0x01) > 0 ? true : false;
#endif
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void WriteIos(IOState DO_PORT)
        {

#if _DEBUG
#else
            try
            {
                int lpBitPattern = 0;
                lpBitPattern += DO_PORT.io0 ? 1 : 0;
                lpBitPattern += (DO_PORT.io1 ? 1 : 0) << 1;
                lpBitPattern += (DO_PORT.io2 ? 1 : 0) << 2;
                lpBitPattern += (DO_PORT.io3 ? 1 : 0) << 3;
                lpBitPattern += (DO_PORT.io4 ? 1 : 0) << 4;
                lpBitPattern += (DO_PORT.io5 ? 1 : 0) << 5;
                lpBitPattern += (DO_PORT.io6 ? 1 : 0) << 6;
                lpBitPattern += (DO_PORT.io7 ? 1 : 0) << 7;
                lpBitPattern += (DO_PORT.io8 ? 1 : 0) << 8;
                lpBitPattern += (DO_PORT.io9 ? 1 : 0) << 9;
                lpBitPattern += (DO_PORT.io10 ? 1 : 0) << 10;
                lpBitPattern += (DO_PORT.io11 ? 1 : 0) << 11;
                lpBitPattern += (DO_PORT.io12 ? 1 : 0) << 12;
                lpBitPattern += (DO_PORT.io13 ? 1 : 0) << 13;
                lpBitPattern += (DO_PORT.io14 ? 1 : 0) << 14;
                lpBitPattern += (DO_PORT.io15 ? 1 : 0) << 15;
                m_DIDO.Write(lpBitPattern);
            }
            catch (Exception ex)
            {
                throw ex;
            }
#endif

        }

        /// <summary>
        /// 打开IO卡，并开启实时检测全部完成信号的上升沿跳变
        /// </summary>
        public void OpenIOCard()
        {
            try
            {
                if (DevID != null)
                    return;
                int iDevID;
#if _DEBUG

#else
                m_DIDO.DeviceType = FVXCOMDIDOLib.DIDO_DEVICE_TYPE.deviceFIO01;
                m_DIDO.Open();
                m_DIDO.GetOpenedDeviceID(out iDevID);
                DevID = iDevID;
#if _N2L
                m_DIDO.Write(3);
#endif
#endif

                //开始检测IO上升沿
                tmr = new System.Timers.Timer(100);
                tmr.Elapsed += Tmr_Elapsed;
                tmr.Start();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        #endregion

        public void Dispose()
        {
            tmr.Close();
#if _DEBUG
#else
            m_DIDO.Close();
#endif
            m_DIDO = null;
        }
    }

}

